home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
wakka
/
source
/
main.c
next >
Wrap
Text File
|
2000-06-25
|
5KB
|
224 lines
/********************************
わっか
メイン
********************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys\iocs.h>
#include <sys\dos.h>
#include "wakka.h"
#include "screen.h"
#include "pad.h"
BLOCK field[LEN][LEN]; /* 盤 */
int field_dx[LEN][LEN]; /* ブロック移動用 */
int field_dy[LEN][LEN];
static int spc_x, spc_y; /* 空白の位置 */
#ifdef WAKKA9
static BLOCK arrange[LEN - 2][LEN - 2] = { /* 正解配置 */
{ 2, 6, 10, 6, 3},
{ 8, 1, 10, 1, 9},
{11, 11, -1, 11, 11},
{ 8, 1, 10, 1, 9},
{ 4, 7, 10, 7, 5}
};
#else
static BLOCK arrange[LEN - 2][LEN - 2] = { /* 正解配置 */
{ 2, 16, 16, 16, 3},
{17, 12, 16, 13, 17},
{17, 17, -1, 17, 17},
{17, 14, 16, 15, 17},
{ 4, 16, 16, 16, 5}
};
#endif
/***************************************
ブロックの移動
引数 dx, dy = 移動元の方向
戻り値 移動したか
***************************************/
static
Bool move_block(int dx, int dy)
{
if ( (((spc_x + dx) % 2) || ((spc_y + dy) % 2))
&& (field[spc_y + dy][spc_x + dx] > 0) ) {
field[spc_y][spc_x] = field[spc_y + dy][spc_x + dx];
field[spc_y + dy][spc_x + dx] = field[spc_y + dy*2][spc_x + dx*2];
field[spc_y + dy*2][spc_x + dx*2] = -1; /* 2つ移動 */
spc_x += dx*2;
spc_y += dy*2;
return TRUE;
}
return FALSE;
}
/***************************************
移動アニメーション
引数 dx, dy = 移動元の方向
戻り値 移動したか
***************************************/
static
Bool move(int dx, int dy)
{
int i, n;
if ( move_block(dx, dy) ) { /* ブロックの移動 */
for (i = 0; i < 12; i++) {
n = (i < 8) ? (7 - i)*32 : 0; /* 一つ目移動 */
field_dx[spc_y][spc_x - dx*2] = dx*n;
field_dy[spc_y - dy*2][spc_x] = dy*n;
n = (i > 4) ? (11- i)*32 : 0x100; /* 二つ目移動 */
field_dx[spc_y][spc_x - dx] = dx*n;
field_dy[spc_y - dy][spc_x] = dy*n;
draw_screen(); /* 画面描画 */
}
return TRUE;
}
return FALSE;
}
/**************
盤初期化
**************/
static
void init_field(void)
{
int i, j;
for (i = 0; i < LEN; i++) { /* 盤クリア */
for (j = 0; j < LEN; j++) {
field[i][j] = ((i == 0) || (i == LEN - 1)
|| (j == 0) || (j == LEN - 1))
? 0 : arrange[i - 1][j - 1];
field_dx[i][j] = 0;
field_dy[i][j] = 0;
if ( field[i][j] < 0 ) { /* 空白 */
spc_x = j;
spc_y = i;
}
}
}
}
/****************
シャッフル
****************/
static
void shuffle_field(void)
{
static int dx[4] = {1, -1, 0, 0},
dy[4] = {0, 0, 1, -1};
int i, j, n;
n = 1;
for (i = 0; i < 100; i++) {
do {
do {
j = rnd(4);
} while ( j == (n ^ 1) ); /* 反対方向 */
} while ( !move_block(dx[j], dy[j]) ); /* 移動 */
n = j;
}
}
/**********************************
クリアチェック
戻り値 TRUE : クリア
FALSE : 未クリア
**********************************/
static
Bool check_clear(void)
{
int i, j;
for (i = 1; i < LEN - 1; i++) {
for (j = 1; j < LEN - 1; j++) {
if ( field[i][j] != arrange[i - 1][j - 1] ) {
return FALSE;
}
}
}
return TRUE;
}
/************************************
ゲームメイン
戻り値 TRUE : ゲーム続行
FALSE : 終了
************************************/
static
Bool game_main(void)
{
static Bool f = TRUE;
PAD pad;
draw_back(rnd(4)); /* 背景描画 */
init_field(); /* 盤初期化 */
if ( f ) {
if ( !wait_clear(FALSE) ) { /* 正解表示 */
return FALSE;
}
f = FALSE;
}
shuffle_field(); /* シャッフル */
while ( !esc_key ) {
draw_screen(); /* 画面描画 */
pad = get_rept(); /* パッド入力 */
if ( pad & PAD_UP ) {
move(0, 1); /* 上移動 */
}
else if ( pad & PAD_DOWN ) {
move(0, -1); /* 下移動 */
}
else if ( pad & PAD_LEFT ) {
move(1, 0); /* 左移動 */
}
else if ( pad & PAD_RIGHT ) {
move(-1, 0); /* 右移動 */
}
if ( check_clear() ) { /* クリア */
return wait_clear(TRUE); /* 入力待ち */
}
}
return FALSE;
}
/************
メイン
************/
int main(int argc, char* argv[])
{
_iocs_tgusemd(0, 2); /* グラフィック画面使用 */
_iocs_tgusemd(1, 2); /* テキスト画面使用 */
_dos_c_curoff(); /* カーソルOFF */
_iocs_crtmod(0x0e); /* 画面モード設定 */
_iocs_g_clr_on(); /* グラフィック画面表示 */
_iocs_b_bpoke((void*)0xe82500, 0x24); /* プライオリティ設定 */
if ( init_screen() ) { /* 画面初期化 */
return 1;
}
srand((unsigned int)_iocs_timeget()); /* 乱数初期化 */
while ( game_main() ); /* ゲームメイン */
_iocs_tgusemd(0, 3); /* グラフィック画面使用 */
_iocs_tgusemd(1, 3); /* テキスト画面使用 */
_dos_c_width(0); /* 画面モード設定 */
_dos_c_curon(); /* カーソルON */
_dos_kflushio(0xff); /* キーバッファクリア */
return 0;
}
/************ End of File ******************************************************/